/*
练习3-1 仅有头指针的队列
分数 20
作者 陈越
单位 浙江大学

如果用一个循环数组表示队列，且只有一个队列头指针 front，不设队列尾指针 rear，而设置计数器 count 用以记录队列中结点的个数。请编写算法实现队列的三个基本运算：判空、入队、出队。
函数接口定义：

bool IsEmpty(Queue queue);

void EnQueue(Queue queue, QElemSet x);

void DeQueue(Queue queue);

其中顺序队列 Queue 的定义如下：

typedef int Position; // 整型下标，表示元素的位置 
typedef struct QueueNode *Queue;
struct QueueNode {
    int capacity;     // 顺序队列的容量 
    Position front;   // 顺序队列的队首指针，初始化为0 
    int count;        // 顺序队队列中结点的个数，初始化为0 
    QElemSet *data;   // 存储数据的数组 
};

函数接口定义中，QElemSet 是用户定义的数据类型，例如 int、double 或者 char 等。函数 IsEmpty 的功能是判断 queue 是否为空队，若是则返回 true，否则返回 false；函数 EnQueue 将元素 x 插入队尾；函数 DeQueue 将队首元素删除。
当调用 EnQueue 但队列已满，或调用 DeQueue 但队列为空时，应该在一行中输出错误信息 ERROR。

输入样例：

3
I 1
I 2
I 3
I 4
O
I 5
O
O
O
O
E

输出样例：

ERROR
1
2
3
5
ERROR
*/

#include <stdio.h>
#include <stdlib.h>

typedef enum {false, true} bool;
typedef int QElemSet;
#define NIL -1
typedef int Position; /* 整型下标，表示元素的位置 */
typedef struct QueueNode *Queue;
struct QueueNode {
    int capacity;     /* 顺序队列的容量 */
    Position front;   /* 顺序队列的队首指针，初始化为0 */
    int count;        /* 顺序队队列中结点的个数，初始化为0 */
    QElemSet *data;   /* 存储数据的数组 */
};
/* 裁判实现的函数，实现细节省略 */
void InitQueue(Queue queue, int kSize); /* 初始化一个大小为kSize的顺序队列 */
bool IsFull(Queue queue);               /* 判断队列是否已满 */
QElemSet GetFront(Queue queue);         /* 取队首元素 */
void DestroyQueue(Queue queue);         /* 销毁队列 */
/* 裁判实现的函数 结束 */

bool IsEmpty(Queue queue);
void EnQueue(Queue queue, QElemSet x);
void DeQueue(Queue queue);

int main(void)
{
    int i, n, x;
    char cmd;
    Queue queue;
    
    queue = (Queue)malloc(sizeof(struct QueueNode));
    scanf("%d\n", &n);
    InitQueue(queue, n);
    scanf("%c ", &cmd);
    while (cmd != 'E') {
        if (cmd == 'I') {
            scanf("%d\n", &x);
            EnQueue(queue, x);
        }
        else {
            x = GetFront(queue);
            if (x != NIL)
                printf("%d\n", x);
            DeQueue(queue);    
        }
        scanf("%c ", &cmd);
    }
    DestroyQueue(queue);
    
    return 0;
}

/* 你的代码将被嵌在这里 */

bool IsEmpty(Queue queue) {
    return queue->count == 0;
}

void EnQueue(Queue queue, QElemSet x) {
    if (IsFull(queue)) {
        printf("ERROR\n");
        return;
    }
    queue->data[(queue->front + queue->count) % queue->capacity] = x;
    queue->count++;
}

void DeQueue(Queue queue) {
    if (IsEmpty(queue)) {
        printf("ERROR\n");
        return;
    }
    queue->front = (queue->front + 1) % queue->capacity;
    queue->count--;
}